Option Explicit

' ======================================================================
' Descriptor
' SQL 格式化器的配置对象
' ======================================================================

' ======================================================================
' Field
' ======================================================================
' ==================================================
' 对齐设置
' ==================================================
' 每个作用域的第一个条件是否需要填充 4 个前缀空格
' (相当于 `and ` 的长度，用来和后面的条件在逻辑运算符之后进行对齐)
' 默认附加 = true
Public firstConditionNeedFillSpace As boolean

' 不同深度进行对齐的最大字符串长度差值
' 默认 10 个字符，对于不同深度，如果其最大长度字符串的插值超过了 10 个字符，则第 N 层不需要和第 N-1 层做对齐
Public multiNestAlignmentStrSizeDiff As Integer

' 对齐级别
' 0 = 不做对齐
' 1 = 兼顾所有级别/深度的需要对齐的元素分组做对齐
'     并使用 `multiNestAlignmentStrSizeDiff` 来限定对齐的阈值
' 2 = 默认级别 = 只在各需要对齐的元素分组内部做对齐
'     各级别的 sql 的 where 条件内部对象，join 内部条件对齐，不同级别之间不会进行对齐
Public alignmentLevel As SqlAlignmentLevel

' 每一级元素深度所需要的前缀空格数量
' --> 获取和设置全部委托给 vba Property
Private fieldElemNestLevelPrefixSpaceCount As SqlAlignmentLevel

' 对齐的方式
' 默认值 = 以条件运算符的右侧为基准进行对齐
Public alignmentPosition As SqlAlignmentPosition

' 对齐元素分组的对齐器
Private aligner As SqlFormatterAligner

' ==================================================
' 其他设置
' ==================================================
' 对于 insert 语句中的[列名列表]和[插入值]，设置否需要在每个列的逗号后面进行换行
' 默认值 = True
Public insertColListNeedLineBreakAfterComma As Boolean

' 是否需要再每个sql的末尾添加分号
' 默认值 = True
Public needSqlEndSemicolon As Boolean

' 连接字符串发生换行时使用的换行符
' 默认使用 CrLf
Public lineBreak As String

' ==================================================
' vba Property 使用的属性
' ==================================================
' 元素嵌套时使用的前缀空格
Private elemNestLevelPrefixSpaceStr As String

' ======================================================================
' 初始化方法
' ======================================================================
Private Sub Class_Initialize()
    ' 每个作用域的第一个条件是否需要填充 4 个前缀空格
    firstConditionNeedFillSpace = True
    ' 不同深度进行对齐的最大字符串长度差值
    multiNestAlignmentStrSizeDiff = 10
    ' 对齐级别
    alignmentLevel = SqlAlignmentLevel.INTERNAL
    ' 每一级元素深度所需要的前缀空格数量
    fieldElemNestLevelPrefixSpaceCount = 4
    ' 对齐的方式
    alignmentPosition = SqlAlignmentPosition.OPERATOR_RIGHT

    ' 对于 insert 语句中的[列名列表]和[插入值]，设置否需要在每个列的逗号后面进行换行
    insertColListNeedLineBreakAfterComma = True
    ' 是否需要再每个sql的末尾添加分号
    needSqlEndSemicolon = True
    ' 连接字符串发生换行时使用的换行符
    lineBreak = vbCrLf
    ' 元素嵌套时使用的前缀空格 --> vba Property
    elemNestLevelPrefixSpaceStr = space(fieldElemNestLevelPrefixSpaceCount)

End Sub

Private Sub Class_Terminate()
    Set aligner = Nothing
End Sub

' ======================================================================
' vba Property
' ======================================================================
' setter 每一级元素深度所需要的前缀空格数量
' 保存数量，并生成等量的空格，保存到 elemNestLevelPrefixSpaceStr
Public Property Let elemNestLevelPrefixSpaceCount(ByVal v As Integer)
    fieldElemNestLevelPrefixSpaceCount = v
    elemNestLevelPrefixSpaceStr = space(fieldElemNestLevelPrefixSpaceCount)
End Property

' getter 每一级元素深度所需要的前缀空格数量
Public Property Get elemNestLevelPrefixSpaceCount() As Integer
    elemNestLevelPrefixSpaceCount = fieldElemNestLevelPrefixSpaceCount
End Property

' 获取元素嵌套时使用的前缀空格
' getter
Public Property Get elemNestLevelPrefixSpace() As String
    elemNestLevelPrefixSpace = elemNestLevelPrefixSpaceStr
End Property

' ======================================================================
' public Function
' ======================================================================
' 获取对齐元素分组的对齐器
Public Function getAligner() As SqlFormatterAligner
    If aligner Is Nothing Then
        Set aligner = New SqlFormatterAligner
        aligner.Init Me
    End If

    Set getAligner = aligner
End Function